/* 
 * Copyright (c) 2004-2005 Massachusetts Institute of Technology. This code was
 * developed as part of the Haystack (http://haystack.lcs.mit.edu/) research 
 * project at MIT. Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation files (the 
 * "Software"), to deal in the Software without restriction, including without 
 * limitation the rights to use, copy, modify, merge, publish, distribute, 
 * sublicense, and/or sell copies of the Software, and to permit persons to whom
 * the Software is furnished to do so, subject to the following conditions: 
 * 
 * The above copyright notice and this permission notice shall be included in 
 * all copies or substantial portions of the Software. 
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE. 
 */

/*
 * Created on Jun 21, 2004
 */
package edu.mit.csail.relo.agent;

import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.gef.commands.UnexecutableCommand;
import org.eclipse.swt.widgets.Display;

import edu.mit.csail.relo.parts.ArtifactEditPart;

/**
 * Adds parents on non-inferred node
 * 
 * @author vineet
 */
public class ParentAsserter extends AgentManager.ViewAgent {

    /* (non-Javadoc)
     * @see edu.mit.csail.relo.agent.AgentManager.ViewAgent#childAdded(edu.mit.csail.relo.parts.ArtifactEditPart, int)
     */
    @Override
    public void childAdded(final ArtifactEditPart child, int index) {
        //ConsoleView.log("ParentAsserter got: " + child  + " with currSL: " + child.getSelectionLevel());

        final CommandStack cs = child.getViewer().getEditDomain().getCommandStack();

        if (child.getSelectionLevel() <= ArtifactEditPart.inferredSL) return;

        Runnable delayedRunner = new Runnable() {
            public void run() {
                Command cmd = getParentAssertionsCommand(child);
                if (cmd != UnexecutableCommand.INSTANCE) cs.execute(cmd);
            }
        };
        Display.getDefault().timerExec(500, delayedRunner);
    }

    private Command getParentAssertionsCommand(final ArtifactEditPart child) {
        CompoundCommand tgtCmd = new CompoundCommand();

        if (child instanceof ArtifactEditPart && ((ArtifactEditPart) child).isActive())
            ((ArtifactEditPart) child).realizeParent(tgtCmd, /*inferring*/ true);

        return tgtCmd.unwrap();
    }

}